1 Introduction

Salbutamol is a short-acting beta-agonist (SABA) which acts on the smooth muscle surrounding the bronchi. By inhibiting smooth muscle contraction, it induces bronchodilation which relieves bronchoconstriction, most commonly seen in patients with asthma or COPD(1). Salbutamol is the most commonly prescribed inhaler in Scotland.

This report aims to investigate the trends regarding prescribing of salbutamol inhalers in Scotland in the year 2024, with a focus on variations across the different seasons throughout the year.

It is important to consider the influence of these factors on the prescribing of salbutamol, as

Across the NHS Health Boards, we would expect a greater number of total prescriptions in health boards with a greater overall population. If we look at data

Here are the sources of the data files used in this report:

We can find the January - June 2024 file and its specific data dictionary here: https://www.opendata.nhs.scot/dataset/prescriptions-in-the-community/resource/f0df380b-3f9b-4536-bb87-569e189b727a

data_jan_jun_2024 <- read_csv("https://www.opendata.nhs.scot/dataset/84393984-14e9-4b0d-a797-b288db64d088/resource/f0df380b-3f9b-4536-bb87-569e189b727a/download/hb_pitc2024_01_06-1.csv") %>% 
  clean_names()

We can find the July - December 2024 file and its specific data dictionary here: https://www.opendata.nhs.scot/dataset/prescriptions-in-the-community/resource/f3b9f2e2-66c0-4310-9b8e-734781d2ed0a

data_jul_dec_2024 <- read_csv("https://www.opendata.nhs.scot/dataset/84393984-14e9-4b0d-a797-b288db64d088/resource/f3b9f2e2-66c0-4310-9b8e-734781d2ed0a/download/hb_pitc2024_07_12-1.csv") %>% 
  clean_names()

We can find the Health Board names dataset and its specific data dictionary here: https://www.opendata.nhs.scot/dataset/geography-codes-and-labels/resource/652ff726-e676-4a20-abda-435b98dd7bdc

HB_lookup <- read_csv("https://www.opendata.nhs.scot/dataset/9f942fdb-e59e-44f5-b534-d6e17229cc7b/resource/652ff726-e676-4a20-abda-435b98dd7bdc/download/hb14_hb19.csv") %>% 
  clean_names()

We can find the NHS Health Boards geographical datasets here: https://www.data.gov.uk/dataset/27d0fe5f-79bb-4116-aec9-a8e565ff756a/nhs-health-boards-scotland

NHS_healthboards <- st_read(here("data", "SG_NHS_HealthBoards_2019.shp"))

We can find the population datasets by health board here: https://statistics.ukdataservice.ac.uk/dataset/scotland-s-census-2022-uv102a-age-by-sex

population_data <- read_csv(here( "data", "UV102a_age_health_board_census.csv"), skip = 10) %>% 
  # Rename the last column to avoid the messy name in column 6
  # and to match column names with the prescription dataset
  rename(Spare = "...6",
         hb_name = "Health Board Area 2019",
         hb_population = Count) %>% 
  # filter the data so that we get the population of the entire health board
  filter(Age == "All people" & Sex == "All people") %>% 
  # select only the relevant columns
  select(hb_name, hb_population) %>% 
  # change health board names so they match the prescription data
  mutate(hb_name = paste("NHS", hb_name))
combined_data_2024 <- bind_rows(data_jan_jun_2024, data_jul_dec_2024) %>% 
  clean_names() %>% 
  full_join(HB_lookup, by = c("hbt" = "hb")) %>%
  select(hb_name, hbt:paid_date_month) %>% 
  filter(!is.na(hb_name)) %>% 
  full_join(population_data, 
            by = join_by(hb_name)) %>% 
  mutate(season = case_when(
    paid_date_month %in% c(202403, 202404, 202405) ~ "Spring", 
    paid_date_month %in% c(202406, 202407, 202408) ~ "Summer", 
    paid_date_month %in% c(202409, 202410, 202411) ~ "Autumn", 
    paid_date_month %in% c(202412, 202401, 202402) ~ "Winter"
    )
  )

#
salbutamol_inhalers <- c("SALBUTAMOL", "AIROMIR", "ASMALAL", "SALAMOL", "SALBULIN", "VENTOLIN")

salbutamol_inhaler_data <- combined_data_2024 %>%
  filter(
    str_detect(bnf_item_description,
    paste(salbutamol_inhalers, collapse = "|"))
    ) %>%
  filter(
    str_detect(bnf_item_description, "HALER")
    )

2 Results

All of the data files were used to produce the following results consisting of a summary table, line graphs and a map.

2.1 Summary Table

salbutamol_inhaler_data_table <- salbutamol_inhaler_data %>%
  group_by(
    hb_name, 
    hb_population
    ) %>% 
  summarise(
    quantity_per_1k = (sum(paid_quantity)/mean(hb_population))*1000
    ) %>% 
  ungroup() %>% 
  gt() %>% 
  tab_header(
    title = "Prescription of Salbutamol Inhalers across NHS Health Boards"
  ) %>% 
  tab_source_note(
    source_note = "Source: 2024 Prescription datasets from the NHS OpenData sources, Health Board Population data from  Scotland's Census Data in UK Data Service source"
  ) %>% 
  cols_label(
    hb_name = "Health Board",
    hb_population = "Health Board Population",
    quantity_per_1k = "Salbutamol Inhaler Prescriptions Per 1,000 people"
  ) %>% 
  fmt_number(
    columns = quantity_per_1k,
    decimals = 0
    ) %>% 
  opt_stylize()
salbutamol_inhaler_data_table
Prescription of Salbutamol Inhalers across NHS Health Boards
Health Board Health Board Population Salbutamol Inhaler Prescriptions Per 1,000 people
NHS Ayrshire and Arran 365256 117,095
NHS Borders 116821 113,141
NHS Dumfries and Galloway 145895 137,279
NHS Fife 371781 121,974
NHS Forth Valley 302784 111,427
NHS Grampian 581040 81,183
NHS Greater Glasgow and Clyde 1177213 120,673
NHS Highland 321321 99,703
NHS Lanarkshire 668027 123,448
NHS Lothian 904628 87,952
NHS Orkney 21958 70,143
NHS Shetland 22986 77,049
NHS Tayside 413992 111,984
NHS Western Isles 26140 112,417
Source: 2024 Prescription datasets from the NHS OpenData sources, Health Board Population data from Scotland's Census Data in UK Data Service source

This table summarises the relevant data

2.2 Line graphs

make_line_graph <- function(
    df, 
    title, 
    subtitle = NULL, 
    facet = FALSE) {
  
  seasonal_plot <- ggplot(
    df,
    aes(
      x = season,
      y = total_quantity_per_1k,
      group = if (facet) hb_name else 1,
      text = paste(
      "Season: ", season, "<br>",
      "Total Prescriptions per 1,000: ", scales::comma(total_quantity_per_1k, accuracy = 1)
      )
    )
  ) +
    geom_line(color = "darkgreen", linewidth = 1) +
    geom_point() +
    labs(
      x = "Season",
      y = "Total Salbutamol Inhaler Prescriptions per 1,000 people",
      title = title,
      subtitle = subtitle
    ) +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

  if (facet) {
    seasonal_plot <- seasonal_plot + facet_wrap(~ hb_name, ncol = 3, scales = "free")
  }

  return(seasonal_plot)
}
total_population_scotland <- population_data %>%
  summarise(
    total_population = sum(hb_population, na.rm = TRUE)
    ) %>%
  pull(total_population)


seasonal_totals <- salbutamol_inhaler_data %>%
  mutate(
    season = factor(season, levels = c("Spring", "Summer", "Autumn", "Winter"))
    ) %>% 
  group_by(season) %>%
  summarise(
    total_quantity = sum(paid_quantity, na.rm = TRUE)
    )


salbutamol_prescriptions_2024 <- seasonal_totals %>%
  mutate(
    total_quantity_per_1k = (total_quantity / total_population_scotland) * 1000
    )


scotland_plot <- make_line_graph(
  salbutamol_prescriptions_2024,
  title = "Seasonal Salbutamol Prescriptions per 1,000 people in 2024"
)

scotland_plotly <- ggplotly(
  scotland_plot,
  tooltip = c("text")
) %>% 
  config(displayModeBar = FALSE)

scotland_plotly

The above graph shows the prescriptions of salbutamol inhalers in Scotland throughout the 4 seasons (spring, summer, autumn and winter) in the year 2024.

There is a clear increase in the number of salbutamol inhaler prescriptions during the winter months compared to the other seasons.

seasonal_hb_totals <- salbutamol_inhaler_data %>%
  group_by(hb_name, season) %>% 
  summarise(
    total_quantity = sum(paid_quantity, na.rm = TRUE),
    population = mean(hb_population, na.rm = TRUE),
    .groups = "drop"
    ) %>% 
    mutate(
    season = factor(season, levels = c("Spring", "Summer", "Autumn", "Winter"))
  ) %>% 
  mutate(
    total_quantity_per_1k = (total_quantity / population) * 1000
    )

health_board_plot <- make_line_graph(
  seasonal_hb_totals,
  title = "Seasonal Salbutamol Prescriptions by Health Board",
  subtitle = "Prescriptions per 1,000 people",
  facet = TRUE
)

health_board_plot 

To further analyse the potential correlation between seasons and prescribing of salbutamol inhalers, the above graphs were produced. Each graph shows the trends in salbutamol inhaler prescriptions across the 4 seasons for each of the 14 health boards.

These graphs allow for comparisons in the seasonal trends in prescriptions between health boards. From this data we can see, similar to the previous graph showing total salbutamol prescriptions across Scotland, that the majority of health boards observe increases in prescriptions during the winter season.

While there are increased prescriptions in winter months in the majority of the health borads, there are similar increases observed in the spring season in the health boards NHS Orkney, Shetland, Tayside and Western Isles. Of these health boards, NHS Western Isles sees a larger peak in prescriptions during spring than winter, and interestingly, NHS Shetland sees its lowest number of prescriptions in winter.

2.3 Map

salbutamol_inhaler_map_data <- NHS_healthboards %>%
  full_join(salbutamol_inhaler_data, 
            by = join_by(HBCode == hbt)) %>% 
  filter(!is.na(HBName)) %>% 
  group_by(hb_name, season, hb_population) %>% 
  summarise(
    paid_quantity = sum(paid_quantity)
    ) %>% 
  summarise(
    quantity_per_1k = (paid_quantity/hb_population)*1000
    )

map_salbutamol_inhaler_per_1k <- salbutamol_inhaler_map_data %>%
  ggplot(
    aes(
      fill = quantity_per_1k, 
      text = paste(
        "Health Board: ", 
        hb_name, "<br>Prescriptions per 1,000: ", comma(quantity_per_1k, accuracy = 1)
        )
      )
    ) +
  geom_sf(colour = "black", size = 0.1) +
  scale_fill_distiller(
    palette = "Greens", 
    direction = 1, name = "No. of Prescriptions per 1,000 people", 
    labels = scales::comma_format()
    ) +
  labs(title = "Salbutamol Inhaler Prescriptions by Health Board") +
  theme_void() +
  theme(plot.title = element_text(face = "bold", size = 16), plot.subtitle = element_text(size = 8))  

map_salbutamol_inhaler_per_1k 

This map shows the number of prescriptions of salbutamol inhalers in each health board.

3 Conclusions

Include Limitations of data and next steps (particularly in terms of data that would allow for further analysis)

However, there are some limitations in the data used in this report. For instance, this report only investigates the available data for the year 2024. Therefore, we cannot conclude that the trends seen in the above data is representative of the seasonal trends in salbutamol inhaler prescriptions in Scotland. It is also difficult to come to a conclusion with the avaiable data whether the trends observed are directly caused by seasonal changes in the environment and weather, as opposed to being correlated with seasonal changes. Lack of acknowledgement of potential confounding variables is a limiting factor in this report.

Regarding potential next steps, it would be useful to research further into seasonal trends in other years along with 2024 to investigate whether the trends observed above are yearly, or if they are different each year. There are no datasets for asthma or COPD prevalence in the ‘Public Health Scotland’ website (https://www.opendata.nhs.scot/). If such data were to become available, the potential seasonal influences could be further studied and investigated in relation to salbutamol inhaler prescriptions for patients with asthma or COPD separately. Since salbutamol inhalers are primarily prescribed for asthma and COPD (and some other conditions as well), it would be useful to investigate whether seasonal changes affect the number of prescriptions for one condition more than the other (for example, if seasonal changes affect asthma patients more than COPD patients and vice versa).

4 References

1.Marques L, Vale N. Salbutamol in the management of asthma: A review. International Journal of Molecular Sciences [Internet]. 2022;23(22). Available from: https://pmc.ncbi.nlm.nih.gov/articles/PMC9696300/